Invalid operation: nums[j] (type *[]int does not support indexing)
今天学习Go的指针时,出现了错误提示:Invalid operation: nums[j] (type ”*[]int does not support indexing)
实现冒泡排序函数时突然想到PHP的引用,其实也是PHP底层用了指针,所以在这里也试了试,然后出现了下面的错误:
func BubbleSort(nums *[]int) {
numsCount := len(*nums)
if numsCount <= 1 {
return
}
for i := 0; i < numsCount; i++ {
flag := false
for j := 0; j < numsCount-i-1; j++ {
if *nums[j] > (*nums)[j+1] {
(*nums)[j], (*nums)[j+1] = (*nums)[j+1], (*nums)[j]
flag = true
}
}
if !flag {
break
}
}
}
可以看到错误的代码:
*nums[j]
由于Go会把上面的代码解析成
*(nums[j])
可实质上,我们传入的nums是数组的指针,并不是nums[j]的指针,所以自然会出错
正确的写法:
(*nums)[j]
正确的是:
func BubbleSort(nums *[]int) {
numsCount := len(*nums)
if numsCount <= 1 {
return
}
for i := 0; i < numsCount; i++ {
flag := false
for j := 0; j < numsCount-i-1; j++ {
if (*nums)[j] > (*nums)[j+1] {
(*nums)[j], (*nums)[j+1] = (*nums)[j+1], (*nums)[j]
flag = true
}
}
if !flag {
break
}
}
}
其实在上面的函数中,传参的类型是切片,所以再使用指针纯粹是多此一举,因为在Golang里,切片和指针都是引用类型,跟PHP不同,不过如果传参改成数组的话,跟PHP是一样的
但是改成数组的话,只能传入等于传参定义好的长度,而且想要获取排序好的数组,同时还需要返回值,比如这样
func BubbleSort(nums [10]int) [10]int {
numsCount := len(nums)
for i := 0; i < numsCount; i++ {
flag := false
for j := 0; j < numsCount-i-1; j++ {
if nums[j] > nums[j+1] {
nums[j], nums[j+1] = nums[j+1], nums[j]
flag = true
}
}
if !flag {
break
}
}
return nums
}
也就是说,如果想使用这个函数的话,只能传入等于10长度的数组,复用性不高,但是改成切片的话,复用性就大大提高了,并且不用提供返回值:
func BubbleSort(nums []int) {
numsCount := len(nums)
if numsCount <= 1 {
return
}
for i := 0; i < numsCount; i++ {
flag := false
for j := 0; j < numsCount-i-1; j++ {
if nums[j] > nums[j+1] {
nums[j], nums[j+1] = nums[j+1], nums[j]
flag = true
}
}
if !flag {
break
}
}
}
PS:使用数组的时候,我用100000长度的数组测试了一下,对于使用了指针和未使用指针的速度对比,测试下来,速度并没有什么变化,按理说应该使用指针后速度会快上不少的,有知道的人可以为我这个初学者解答一下,谢谢!
©著作权归作者所有,转载或内容合作请联系作者